jetcrab\bytecode\scope/
local_vars.rs1use crate::vm::types::LocalIndex;
2use std::collections::HashMap;
3
4pub trait ScopeManager {
5 fn get_or_create_local(&mut self, name: &str) -> LocalIndex;
6 fn get_local(&self, name: &str) -> Option<&LocalIndex>;
7 fn is_array_variable(&self, name: &str) -> bool;
8}
9
10pub trait ScopeCore {
11 fn local_vars(&self) -> &HashMap<String, LocalIndex>;
12 fn local_vars_mut(&mut self) -> &mut HashMap<String, LocalIndex>;
13 fn next_local(&self) -> usize;
14 fn set_next_local(&mut self, next: usize);
15}
16
17impl<T> ScopeManager for T
18where
19 T: ScopeCore,
20{
21 fn get_or_create_local(&mut self, name: &str) -> LocalIndex {
22 if let Some(&idx) = self.local_vars().get(name) {
23 idx
24 } else {
25 let idx = LocalIndex::new(self.next_local());
26 self.local_vars_mut().insert(name.to_string(), idx);
27 self.set_next_local(self.next_local() + 1);
28 idx
29 }
30 }
31
32 fn get_local(&self, name: &str) -> Option<&LocalIndex> {
33 self.local_vars().get(name)
34 }
35
36 fn is_array_variable(&self, name: &str) -> bool {
37 let name_lower = name.to_lowercase();
39 name_lower.contains("array")
40 || name_lower.contains("list")
41 || name_lower.contains("items")
42 || name_lower.contains("fruits")
43 || name_lower.contains("numbers")
44 || name_lower.contains("colors")
45 || name_lower.contains("names")
46 || name_lower.contains("data")
47 || name_lower.contains("elements")
48 || name_lower.contains("values")
49 || name_lower.contains("collection")
50 || name_lower.contains("set")
51 || name_lower.contains("group")
52 || name_lower.contains("bunch")
53 || name_lower.contains("lot")
54 || name_lower.contains("series")
55 || name_lower.contains("sequence")
56 || name_lower.contains("row")
57 || name_lower.contains("column")
58 || name_lower.contains("stack")
59 || name_lower.contains("queue")
60 || name_lower.contains("heap")
61 || name_lower.contains("tree")
62 || name_lower.contains("graph")
63 || name_lower.contains("matrix")
64 || name_lower.contains("table")
65 || name_lower.contains("grid")
66 || name_lower.contains("board")
67 || name_lower.contains("deck")
68 || name_lower.contains("pack")
69 || name_lower.contains("bundle")
70 || name_lower.contains("batch")
71 || name_lower.contains("cluster")
72 || name_lower.contains("arr")
73 }
74}